package log

import (
	"fmt"
	"os"
	"path/filepath"
	"time"

	"golang.org/x/text/encoding/simplifiedchinese"
	"golang.org/x/text/transform"
)

// LogFile 结构体用于处理日志文件操作
type LogFile struct {
	file *os.File
}

// NewLogFile 创建一个新的 LogFile 实例
func NewLogFile(filePath string) (*LogFile, error) {
	if info, err := os.Lstat(filePath); err == nil { // 如果文件存在, 检查是否为目录
		if info.IsDir() { // 如果是目录, 则返回错误
			return nil, fmt.Errorf("%s是一个目录", filePath)
		}
	}

	// 确保父目录存在
	if err := os.MkdirAll(filepath.Dir(filePath), 0755); err != nil {
		return nil, fmt.Errorf("无法创建日志目录: %v", err)
	}

	// 打开或创建日志文件
	file, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		// 判断是否为权限错误
		if os.IsPermission(err) {
			return nil, fmt.Errorf("没有权限写入日志文件: %v", err)
		}

		// 判断是否为其他错误
		return nil, fmt.Errorf("无法打开日志文件: %v", err)
	}
	return &LogFile{file: file}, nil
}

// WriteLog 按照指定格式写入日志
func (lf *LogFile) WriteLog(message string) {
	timestamp := time.Now().Format("2006-01-02 15:04:05")
	logEntry := fmt.Sprintf("%s %s\r\n", timestamp, message)
	// 转换为GBK编码
	encoder := simplifiedchinese.GBK.NewEncoder()
	gbkBytes, _, err := transform.Bytes(encoder, []byte(logEntry))
	if err != nil {
		fmt.Printf("日志编码转换失败: %v\r\n", err)
		return
	}
	_, err = lf.file.Write(gbkBytes)
	if err != nil {
		fmt.Printf("无法写入日志: %v\r\n", err)
	}
}

// Close 关闭日志文件
func (lf *LogFile) Close() error {
	return lf.file.Close()
}
